<?php

class BalanceController extends Zend_Controller_Action
{
    public function init()
    {
        if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    //---------------------------------//
    //             PAGINAS             //
    //---------------------------------//

    public function crearAction()
    {
        //if (X\CheckAccess::PageAction('Reporte.Balance')) return;

        try{
            // obtener los datos
            $presupuestos = $this->em->createQueryBuilder()
                    ->select         ('p.codigoPresupuesto')
                    ->addselect      ('p.periodo')
                    ->from           ('Default_Model_Presupuesto', 'p')
                    ->orderBy        ('p.periodo', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            // convertir a json
            $this->view->jsonPresupuestos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($presupuestos),
                "rows"    => $presupuestos
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.';
        }
    }

    public function ajaxCrearAction()
    {
        //if (X\CheckAccess::AjaxAction($this, 'Reporte.Balance')) return;

        try{

            $presupuesto = $this->_request->getPost('codigoPresupuesto');
            $periodo     = $this->_request->getPost('nombre');

            // obtener los distintos departamentos/centros de costos
            $departamentos = $this->em->createQueryBuilder()
                ->select    ('d.codigoDepartamento')
                ->addselect ('d.nombreDepartamento')
                ->addselect ('d.isDepartment')
                ->from      ('Default_Model_Departamento', 'd')
                ->getQuery  ()
                ->execute   ();

            // convertir a un array con key=codigo
            $dptos = array();
            $dptoMax = 4;
            $dptoCount =0;

            foreach($departamentos as $dpto){
                $dptos[$dpto['codigoDepartamento']] = array(
                    'codigo'  => $dpto['codigoDepartamento'],
                    'nombre'  => $dpto['nombreDepartamento'],
                    'pag'     => intval($dptoCount/$dptoMax),
                    'posx'    => (($dptoCount++%$dptoMax)*130)+300,
                    'montoP' => 0,
                    'montoE' => 0,
                    'diferenciaP' => 0,
                    'diferenciaE' => 0
                );
            }
            unset($departamentos);

            $sqb = $this->em->createQueryBuilder()
                        ->select    ('rp.codigoRubro AS codigoPadre')
                        ->addSelect ('d.nombreDepartamento')
                        ->addSelect ('d.codigoDepartamento')
                        ->addSelect ('sum(c.montoInicial) AS totali')
                        ->addSelect ('sum(c.montoEjecutado) AS totale')
                        ->addSelect ('r.egreso')
                        ->from      ('Default_Model_Cuenta', 'c')
                        ->join      ('c.presupuesto', 'p')
                        ->leftJoin  ('c.rubro', 'r')
                        ->join      ('r.padre', 'rp')
                        ->leftJoin  ('c.departamento', 'd')
                        ->where     ("p.codigoPresupuesto = $presupuesto")
                        ->groupBy   ('d.nombreDepartamento, d.codigoDepartamento, rp.codigoRubro, r.egreso')
                        ->orderBy   ('r.egreso, rp.codigoRubro, d.codigoDepartamento', 'ASC')
                        ->getQuery  ()
                        ->execute   ();


            /**********************************
                          BALANCE
             *********************************/

            $pdf   = new Zend_Pdf();
            $font  = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
            $font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD);

            //---------------------------------------------------//
            //     CREA LAS PAGINAS HORIZONTALES E INICIALIZA    //
            //---------------------------------------------------//

            $pages = array();
            $pagMax  = intval(($dptoCount-1)/$dptoMax);

            for ($i = 0; $i <= $pagMax; $i++) {
                // crea la pagina
                $p = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4_LANDSCAPE);//'842:595:'
                // dibujos iniciales
                $p->setFont($font, 9)
                  ->drawText('Rubro', 20, 557);

                $p->setLineColor(new Zend_Pdf_Color_Rgb(0,0,0))
                  ->drawLine(10, 570, ($p->getWidth()-10), 570)
                  ->drawLine(10, 550, ($p->getWidth()-10), 550)
                  ->drawLine(10, 530, ($p->getWidth()-10), 530)
                  ->drawLine(280, 105, 280, 570);

                // agrega al pdf
                $pdf->pages[] = $p;
                $pages[]      = $p;
            }

            // LOS HEADERS DE CADA COLUMNA
            foreach($dptos as $dpto){
                // obtener la pagina donde esta el departamento
                $p = $pages[$dpto['pag']];
                // dibujar
                $p->setFont($font, 9)
                  ->drawText($dpto['nombre'], $dpto['posx'], 557, 'UTF-8');
                $p->setFont($font, 7)
                  ->drawText('Presupuestado', $dpto['posx'],538)
                  ->drawText('Ejecutado', $dpto['posx']+79,538);
            }

            // IMPRIMIR Y CALCULAR LAS CUENTAS
            $y         = 532;  // posicion "y" actual
            $esIngreso = true; // para detectar final de los ingresos (e imprimir los subtotales)
            
            $padreAct = 0;

            foreach($sqb as $row){

                //Indica el fin de los ingresos, la bandera se usa para no repetir el proceso
                if($esIngreso && $row['egreso']){

                    $esIngreso = false;

                    $y = $y - 12;

                    // imprimir los subtotales (marcos)
                    for ($i = 0; $i <= $pagMax; $i++) {
                        $p = $pages[$i];

                        $p->setFont($font2, 9)
                          ->drawText('TOTAL INGRESOS', 20, $y);
                    }

                    // imprimir los subtotales (datos)
                    foreach($dptos as $dpto){
                        $montop = number_format($dpto['montoP'],0,',','.');
                        $mpx = $dpto['posx']+50-($this->getTextWidth($montop,$font,7));
                        $montoe = number_format($dpto['montoE'],0,',','.');
                        $mex = $dpto['posx']+110-($this->getTextWidth($montoe,$font,7));
                        $p = $pages[$dpto['pag']];
                        $p->setFont($font2, 7)
                          ->drawText($montop, $mpx, $y)
                          ->drawText($montoe, $mex, $y);

                        // suma para despues restar los egresos
                        $dptos[$dpto['codigo']]['diferenciaP'] = $dpto['montoP'];
                        $dptos[$dpto['codigo']]['diferenciaE'] = $dpto['montoE'];

                        // inicializar para poder calcular los subtotal egresos
                        $dptos[$dpto['codigo']]['montoP'] = 0;
                        $dptos[$dpto['codigo']]['montoE'] = 0;
                    }

                    // espaciado para iniciar egresos
                    $y = $y - 24;

                }

                if ($y-30 <= 90){

                    // posicion "y" actual
                    $y  = 532;

                    // vaciamos pages[] para luego recargarlo con las nuevas paginas
                    $pages = array();

                    // se agrega mas paginas
                    for ($i = 0; $i <= $pagMax; $i++) {
                        // crea la pagina
                        $p = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4_LANDSCAPE);//'842:595:'
                        // dibujos iniciales
                        $p->setFont($font, 9)
                          ->drawText('Rubro', 20, 557);

                        $p->setLineColor(new Zend_Pdf_Color_Rgb(0,0,0))
                          ->drawLine(10, 570, ($p->getWidth()-10), 570)
                          ->drawLine(10, 550, ($p->getWidth()-10), 550)
                          ->drawLine(10, 530, ($p->getWidth()-10), 530)
                          ->drawLine(280, 105, 280, 570);

                        // agrega al pdf
                        $pdf->pages[] = $p;
                        $pages[]      = $p;
                    }

                    // LOS HEADERS DE CADA COLUMNA
                    foreach($dptos as $dpto){
                        // obtener la pagina donde esta el departamento
                        $p = $pages[$dpto['pag']];
                        // dibujar
                        $p->setFont($font, 9)
                          ->drawText($dpto['nombre'], $dpto['posx'], 557, 'UTF-8');
                        $p->setFont($font, 7)
                          ->drawText('Presupuestado', $dpto['posx'],538)
                          ->drawText('Ejecutado', $dpto['posx']+79,538);
                    }
                }

                // imprimir nombre del rubro padre
                if($padreAct != $row['codigoPadre']){
                    $y = $y - 12;
                    $padreAct = $row['codigoPadre'];
                    $rubroData=$this->em->find('Default_Model_Rubro', $row['codigoPadre']);
                    $rubroName = $rubroData->getNombre();
                    $rubroCode = $rubroData->getCodigo();
                    for ($i = 0; $i <= $pagMax; $i++) {
                        $p = $pages[$i];
                        $p->setFont($font, 7);
                        $p->drawText(substr($rubroName,0,65), 20, $y,'UTF-8');
                    }
                }
                    
                $codigo = $row['codigoDepartamento'];
                $dpto   = $dptos[$codigo];
                $montoi = number_format($row['totali'],0,',','.');
                $mix    = $dpto['posx']+47-($this->getTextWidth($montoi,$font,7));
                $montoe = number_format($row['totale'],0,',','.');
                $mex    = $dpto['posx']+110-($this->getTextWidth($montoe,$font,7));
                $p      = $pages[$dpto['pag']];
                $p->setFont($font, 7)
                  ->drawText($montoi, $mix,$y)
                  ->drawText($montoe, $mex,$y);

                // sumar subtotal
                $dptos[$codigo]['montoP'] += $row['totali'];
                $dptos[$codigo]['montoE'] += $row['totale'];

            }

            $y = $y - 12;

            // imprimir los subtotales (marcos)
            for ($i = 0; $i <= $pagMax; $i++) {
                $p = $pages[$i];

                $p->setFont($font2, 9)
                  ->drawText('TOTAL EGRESOS', 20, $y)
                  ->drawText('DIFERENCIA', 20, $y-12);
            }

            // imprimir los subtotales (datos)
            foreach($dptos as $dpto){
                $montop = number_format($dpto['montoP'],0,',','.');
                $mpx    = $dpto['posx']+50-($this->getTextWidth($montop,$font,7));
                $montoe = number_format($dpto['montoE'],0,',','.');
                $mex    = $dpto['posx']+110-($this->getTextWidth($montoe,$font,7));
                $p = $pages[$dpto['pag']];
                $p->setFont($font2, 7)
                  ->drawText($montop, $mpx, $y)
                  ->drawText($montoe, $mex, $y);

                // calcular la diferencia
                $dpto['diferenciaP'] -= $dpto['montoP'];
                $dpto['diferenciaE'] -= $dpto['montoE'];

                $difp = number_format($dpto['diferenciaP'],0,',','.');
                $dpx = $dpto['posx']+50-($this->getTextWidth($difp,$font,7));
                $dife = number_format($dpto['diferenciaE'],0,',','.');
                $dex = $dpto['posx']+110-($this->getTextWidth($dife,$font,7));

                $p->setFont($font2, 7)
                  ->drawText($difp, $dpx, $y-12)
                  ->drawText($dife, $dex, $y-12);
            }

            $pageNumber=1;
            $today = date('d/m/Y');
            $text  = "Presupuesto ".$periodo." al ".$today;
            foreach($pdf->pages as $p){
                $nro = strval($pageNumber++);
                $p->setFont($font, 7)
                  ->drawText($nro, 799-($this->getTextWidth($nro,$font,7)), 40)
                  ->drawText($text, 799-($this->getTextWidth($text,$font,7)), 50);
            }

            $pdfName='Balance';
            $pdf->save($pdfName.'.pdf');

            X\Msg::Success('El balance se generó con exito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al generar el reporte.'.$e->getMessage());
        }
    }

    public function verAction(){
       $pdf = Zend_Pdf::load('Balance.pdf');

       $this->getResponse()->setHeader('Content-type', 'application/x-pdf', true);
       $this->getResponse()->setHeader('Content-disposition', "filename=Balance.pdf", true);
       $this->getResponse()->setBody($pdf->render());
    }

   public function getTextWidth($text, Zend_Pdf_Resource_Font $font, $font_size)
    {
	$drawing_text = iconv('', 'UTF-16BE', $text);
	$characters    = array();
	for ($i = 0; $i < strlen($drawing_text); $i++) {
		$characters[] = (ord($drawing_text[$i++]) << 8) | ord ($drawing_text[$i]);
	}
	$glyphs        = $font->glyphNumbersForCharacters($characters);
	$widths        = $font->widthsForGlyphs($glyphs);
	$text_width   = (array_sum($widths) / $font->getUnitsPerEm()) * $font_size;
	return $text_width;
    }

}
